package app.models;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

import app.models.enums.StatusBiometria;
import app.models.enums.StatusConsulta;
import app.models.enums.TipoConsulta;
import app.util.DateUtils;

/**
 * @author Douglas Fernandes
 * @since 22/11/2013
 */

@Entity
@Table(name = "CONSULTA")
public class Consulta implements Pojo {
	
	private static final long serialVersionUID = 2533079156016816580L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ID")
	private Long id;
	
	@NotNull(message = "{especialista.empty}")
	@Column(name = "ID_ESPECIALISTA", columnDefinition = "integer")
	private Integer idEspecialista;
	
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_ESPECIALISTA", referencedColumnName = "ID", insertable = false, updatable = false)
	private Funcionario especialista;
	
	@Column(name = "ID_SECRETARIA", columnDefinition = "integer")
	private Integer idSecretaria;
	
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_SECRETARIA", referencedColumnName = "ID", insertable = false, updatable = false)
	private Funcionario secretaria;
	
	@NotNull(message = "{paciente.empty}")
	@Column(name = "ID_PACIENTE", columnDefinition = "integer")
	private Integer idPaciente;
	
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_PACIENTE", referencedColumnName = "ID", insertable = false, updatable = false)
	private Paciente paciente;
	
	@Column(name = "ID_CONVENIO", columnDefinition = "integer")
	private Integer idConvenio;
	
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_CONVENIO", referencedColumnName = "ID", insertable = false, updatable = false)
	private Convenio convenio;
	
	@Column(name = "ID_ESPECIALIDADE", columnDefinition = "integer")
	private Integer idEspecialidade;
	
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_ESPECIALIDADE", referencedColumnName = "ID", insertable = false, updatable = false)
	private Especialidade especialidade;
	
	@Column(name = "ID_SUBESPECIALIDADE", columnDefinition = "integer")
	private Integer idSubEspecialidade;
	
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_SUBESPECIALIDADE", referencedColumnName = "ID", insertable = false, updatable = false)
	private SubEspecialidade subEspecialidade;

	@NotNull(message = "{tipoConsulta.empty}")
	@Column(name = "TIPO", columnDefinition = "varchar(30)")
	@Enumerated(EnumType.STRING)
	private TipoConsulta tipo;
	
	@Pattern(regexp = "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}", message = "{data.malformed}")
	@NotNull(message = "{data.empty}")
	@Column(name = "DATA", columnDefinition = "date")
	private String data;
	
	@Pattern(regexp = "[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}", message = "{horaInicial.malfored}")
	@NotNull(message = "{horaInicial.empty}")
	@Column(name = "HORA_INICIAL", columnDefinition = "time")
	private String horaInicial;

	@Pattern(regexp = "[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}", message = "{horaFinal.malfored}")
	@NotNull(message = "{horaFinal.empty}")
	@Column(name = "HORA_FINAL", columnDefinition = "time")
	private String horaFinal;
	
	@Pattern(regexp = "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}", message = "{dataPagamento.malformed}")
	@Column(name = "DATA_PAGAMENTO", columnDefinition = "date")
	private String dataPagamento;
	
	@NotNull(message = "{valor.empty}")
	@Column(name = "VALOR", columnDefinition = "double")
	private Double valor;
	
	@NotNull(message = "{statusConsulta.empty}")
	@Column(name = "STATUS_CONSULTA", columnDefinition = "varchar(50)")
	@Enumerated(EnumType.STRING)
	private StatusConsulta status = StatusConsulta.MARCADA;
	
	@Column(name = "STATUS_BIOMETRIA", columnDefinition = "varchar(50)")
	@Enumerated(EnumType.STRING)
	private StatusBiometria statusBiometria = StatusBiometria.NAO;
	
	@Pattern(regexp = "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}", message = "{dataCadastro.malformed}")
	@NotNull(message = "{dataCadastro.empty}")
	@Column(name = "DATA_CADASTRO", columnDefinition = "date")
	private String dataCadastro = DateUtils.getDataAtual();
	
	@Pattern(regexp = "[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}", message = "{horaCadastro.malformed}")
	@NotNull(message = "{horaCadastro.empty}")
	@Column(name = "HORA_CADASTRO", columnDefinition = "time")
	private String horaCadastro = DateUtils.getHoraCompletaAtual();
	
	@Transient
	private boolean flagPagou = false;
	
	@Transient
	private String dataInicial = "";
	
	@Transient
	private String dataFinal = "";
	
	@Transient
	private Double desconto;
	
	@Transient
	private String nomePaciente = "";
	
	@Transient
	private Integer hour;
	
	@Transient
	private String descontoString = "";
	
	public void setId(Long id) {
		this.id = id;
	}

	public String getDescontoString() {
		return descontoString;
	}

	public void setDescontoString(String descontoString) {
		this.descontoString = descontoString;
	}

	public String getHoraCadastro() {
		return horaCadastro;
	}

	public void setHoraCadastro(String horaCadastro) {
		this.horaCadastro = horaCadastro;
	}

	public Long getId() {
		return id;
	}

	public String getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(String dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public Double getDesconto() {
		return desconto;
	}

	public void setDesconto(Double desconto) {
		this.desconto = desconto;
	}

	public void setIdPaciente(Integer idPaciente) {
		this.idPaciente = idPaciente;
	}

	public Integer getIdPaciente() {
		return idPaciente;
	}

	public String getNomePaciente() {
		return nomePaciente;
	}

	public void setNomePaciente(String nomePaciente) {
		this.nomePaciente = nomePaciente;
	}

	public void setIdConvenio(Integer idConvenio) {
		this.idConvenio = idConvenio;
	}

	public Integer getIdConvenio() {
		return idConvenio;
	}

	public TipoConsulta getTipo() {
		return tipo;
	}

	public void setTipo(TipoConsulta tipo) {
		this.tipo = tipo;
	}

	public void setData(String data) {
		this.data = data;
	}

	public String getData() {
		return data;
	}

	public String getDataPagamento() {
		return dataPagamento;
	}

	public void setDataPagamento(String dataPagamento) {
		this.dataPagamento = dataPagamento;
	}

	public String getHoraInicial() {
		return horaInicial;
	}

	public void setHoraInicial(String horaInicial) {
		this.horaInicial = horaInicial;
	}

	public String getHoraFinal() {
		return horaFinal;
	}

	public void setHoraFinal(String horaFinal) {
		this.horaFinal = horaFinal;
	}

	public void setValor(Double valor) {
		this.valor = valor;
	}

	public Double getValor() {
		return valor;
	}

	public Integer getIdEspecialista() {
		return idEspecialista;
	}

	public void setIdEspecialista(Integer idEspecialista) {
		this.idEspecialista = idEspecialista;
	}

	public Funcionario getEspecialista() {
		return especialista;
	}

	public void setEspecialista(Funcionario especialista) {
		this.especialista = especialista;
	}

	public Integer getIdSecretaria() {
		return idSecretaria;
	}

	public void setIdSecretaria(Integer idSecretaria) {
		this.idSecretaria = idSecretaria;
	}

	public Funcionario getSecretaria() {
		return secretaria;
	}

	public void setSecretaria(Funcionario secretaria) {
		this.secretaria = secretaria;
	}

	public Paciente getPaciente() {
		return paciente;
	}

	public void setPaciente(Paciente paciente) {
		this.paciente = paciente;
	}

	public Convenio getConvenio() {
		return convenio;
	}

	public void setConvenio(Convenio convenio) {
		this.convenio = convenio;
	}

	public Integer getIdEspecialidade() {
		return idEspecialidade;
	}

	public void setIdEspecialidade(Integer idEspecialidade) {
		this.idEspecialidade = idEspecialidade;
	}

	public Especialidade getEspecialidade() {
		return especialidade;
	}

	public void setEspecialidade(Especialidade especialidade) {
		this.especialidade = especialidade;
	}

	public Integer getIdSubEspecialidade() {
		return idSubEspecialidade;
	}

	public void setIdSubEspecialidade(Integer idSubEspecialidade) {
		this.idSubEspecialidade = idSubEspecialidade;
	}

	public SubEspecialidade getSubEspecialidade() {
		return subEspecialidade;
	}

	public void setSubEspecialidade(SubEspecialidade subEspecialidade) {
		this.subEspecialidade = subEspecialidade;
	}

	public StatusConsulta getStatus() {
		return status;
	}

	public void setStatus(StatusConsulta status) {
		this.status = status;
	}

	public StatusBiometria getStatusBiometria() {
		return statusBiometria;
	}

	public void setStatusBiometria(StatusBiometria statusBiometria) {
		this.statusBiometria = statusBiometria;
	}
	
	public boolean isFlagPagou() {
		return flagPagou;
	}
	
	public void setFlagPagou(boolean flagPagou) {
		this.flagPagou = flagPagou;
	}

	public String getDataInicial() {
		return dataInicial;
	}

	public void setDataInicial(String dataInicial) {
		this.dataInicial = dataInicial;
	}

	public String getDataFinal() {
		return dataFinal;
	}

	public void setDataFinal(String dataFinal) {
		this.dataFinal = dataFinal;
	}

	public Integer getHour() {
		return hour;
	}

	public void setHour(Integer hour) {
		this.hour = hour;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Consulta other = (Consulta) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}
